﻿namespace CSharpPro._1016;

public class Demo2
{
    //作业1
    public void TestPrint1()
    { Console.WriteLine("请输入三个整数，用空格分隔：");
        
        // 读取输入并分割成三个字符串
        string[] input = Console.ReadLine().Split();
        
        // 将字符串转换为整数
        int x = int.Parse(input[0]);
        int y = int.Parse(input[1]);
        int z = int.Parse(input[2]);
        
        // 调用排序方法
        SortAndPrint(x, y, z);
    }
    
    // 排序并输出三个整数
    static void SortAndPrint(int a, int b, int c)
    {
        int temp;
        
        // 确保a是最小的
        if (a > b)
        {
            temp = a;
            a = b;
            b = temp;
        }
        
        if (a > c)
        {
            temp = a;
            a = c;
            c = temp;
        }
        
        // 确保b小于等于c
        if (b > c)
        {
            temp = b;
            b = c;
            c = temp;
        }
        
        // 输出排序结果
        Console.WriteLine("从小到大排序结果：" + a + " " + b + " " + c);
        
        
    }
    //作业2
    public void TestPrint2()
    {
        
        int sum = 0;
        List<int> validNumbers = new List<int>();

        // 遍历1到100的所有数字
        for (int i = 1; i <= 100; i++)
        {
            // 检查是否是7的倍数
            bool isMultipleOf7 = i % 7 == 0;
            
            // 检查是否包含数字7
            bool contains7 = i.ToString().Contains("7");

            // 筛选出既不是7的倍数也不包含7的数字
            if (!isMultipleOf7 && !contains7)
            {
                validNumbers.Add(i);
                sum += i;
            }
        }

        // 输出符合条件的数字
        Console.WriteLine("1-100之间所有不是7的倍数且不包含7的数字：");
        Console.WriteLine(string.Join(" ", validNumbers));

        // 输出这些数字的和
        Console.WriteLine("\n这些数字的总和是：" + sum);
    }
    //作业3
    public void TestPrint3()
    {
        Console.WriteLine("九九乘法表：");
        Console.WriteLine("---------------------------");
        
        // 外层循环控制乘数（1-9）
        for (int i = 1; i <= 9; i++)
        {
            // 内层循环控制被乘数（1-i）
            for (int j = 1; j <= i; j++)
            {
                // 格式化输出，确保对齐
                Console.Write($"{j}×{i}={i * j}\t");
            }
            // 每一行结束后换行
            Console.WriteLine();
        }
        
        Console.WriteLine("---------------------------");
    }
    //作业4
    public void TestPrint4()
    {
        List<int> perfectNumbers = new List<int>();
        
        // 遍历2到1000的所有数（1不是完数）
        for (int num = 2; num <= 1000; num++)
        {
            int factorSum = 1; // 1是所有大于1的数的真因子
            
            // 查找所有真因子（从2到num/2）
            for (int i = 2; i <= num / 2; i++)
            {
                if (num % i == 0)
                {
                    factorSum += i;
                }
            }
            
            // 判断是否为完数
            if (factorSum == num)
            {
                perfectNumbers.Add(num);
            }
        }
        
        // 输出结果
        Console.WriteLine("1000以内的所有完数为：");
        foreach (int perfectNum in perfectNumbers)
        {
            Console.Write(perfectNum + " ");
            
            // 显示该完数的所有真因子，方便验证
            Console.Write("(真因子：1");
            for (int i = 2; i < perfectNum; i++)
            {
                if (perfectNum % i == 0)
                {
                    Console.Write(", " + i);
                }
            }
            Console.WriteLine(")");
        }
    }
    //作业5
    public void TestPrint5()
    {
        Console.Write("请输入一个正整数：");
        string input = Console.ReadLine();
        
        // 验证输入是否为正整数
        if (int.TryParse(input, out int number) && number > 0)
        {
            // 1. 统计位数
            int digitCount = input.Length;
            Console.WriteLine($"该数字是 {digitCount} 位数");
            
            // 2. 逆序打印各位数字
            Console.Write("逆序打印各位数字：");
            
            // 方法1：通过字符串反转（简单直观）
            for (int i = input.Length - 1; i >= 0; i--)
            {
                Console.Write(input[i] + " ");
            }
            
            Console.WriteLine();
            
            // 方法2：通过数学运算（不依赖字符串转换）
            Console.Write("逆序打印各位数字（数学方法）：");
            int temp = number;
            while (temp > 0)
            {
                Console.Write(temp % 10 + " "); // 取最后一位
                temp /= 10; // 移除最后一位
            }
            Console.WriteLine();
        }
        else
        {
            Console.WriteLine("输入无效，请输入一个正整数！");
        }
    }
    //作业6
    public void TestPrint6()
    {
        Console.Write("请输入菱形的行数（建议输入奇数）：");
        string input = Console.ReadLine();
        
        // 验证输入是否为正整数
        if (int.TryParse(input, out int rows) && rows > 0)
        {
            // 确保行数为奇数（菱形需要对称）
            if (rows % 2 == 0)
            {
                rows++;
                Console.WriteLine($"已自动调整为奇数行数：{rows}");
            }
            
            PrintDiamond(rows);
        }
        else
        {
            Console.WriteLine("输入无效，请输入一个正整数！");
        }
    }
    
    /// <summary>
    /// 根据指定的行数打印菱形
    /// </summary>
    /// <param name="rows">菱形的总行数（必须为奇数）</param>
    static void PrintDiamond(int rows)
    {
        int half = rows / 2;
        
        // 打印上半部分（包括中间行）
        for (int i = 0; i <= half; i++)
        {
            // 打印空格
            Console.Write(new string(' ', half - i));
            // 打印星号
            Console.WriteLine(new string('*', 2 * i + 1));
        }
        
        // 打印下半部分
        for (int i = half - 1; i >= 0; i--)
        {
            // 打印空格
            Console.Write(new string(' ', half - i));
            // 打印星号
            Console.WriteLine(new string('*', 2 * i + 1));
        }
    }
}